/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Klient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.util.Vector;


/**
 *
 * @author cigol
 */
public class PokerKlient {


    private Socket socket;
    private int servPort;
    private String server;
    private static final int BUFSIZE = 64;
    private BufferedReader in;
    private PrintWriter out;
    private Gracz gracz;
    private Integer aktualnaStawka;
    public PokerKlient() throws IOException {
        this.server = "localhost";
        this.servPort = 1928;
        this.socket = new Socket(this.server, this.servPort);
        this.aktualnaStawka = 0;
        this.gracz = new Gracz();
        this.in = new BufferedReader(
                new InputStreamReader(
                this.socket.getInputStream()));
        this.out = new PrintWriter(
                this.socket.getOutputStream(), true);
    }


    public String odbierzDane() throws IOException
    {
        String dane;
        dane = in.readLine();
        return dane;
    }

    public void wyslijDane(String dane) throws IOException
    {
        this.out.println(dane);
        this.out.flush();   
    }

    public Integer wczytajInt(Integer min, Integer max, boolean pas)
    {
        Scanner sc = new Scanner(System.in);
        Integer liczba;
        while (true)
        {
            liczba = sc.nextInt();
            // w przypadku -1 jest pas
            if (pas == true && liczba == -1)
                break;
            if (liczba >= min && liczba <= max)
                break;
            else System.out.println("Musisz wpisac liczba z przedzialu ("+min+"-"+max+")");
        }
        return liczba;
    }

    public Integer odbierzInta() throws IOException
    {
        String odebrane = this.odbierzDane();
        return new Integer(odebrane);
    }

    public void komunikuj() throws IOException
    {
        String odebrane;
        Scanner sc = new Scanner(System.in);
        
        while (true)
        {
            // odbieramy naglowek
            odebrane = this.odbierzDane();
            //System.out.println(odebrane);

            // serwer pyta ilu nas gra
            if (odebrane.equals("iluGraczy")) {
                System.out.println("Podaj liczbe graczy do gry w Pokera (2-4)");
                //int iluGraczy = 1;
                //int iluGraczy = sc.nextInt();
                int iluGraczy = wczytajInt(2, 4, false);
                this.out.println(iluGraczy);
            }

            // pytamy pierwszego gracza jaka jest pula wejsciowa
            else if (odebrane.equals("iloscKasy"))
            {
                System.out.println("Jaka jest pula wejsciowa (ante)? (100-100000)");
                //int pulaWejsciowa = 1000;
                int pulaWejsciowa = sc.nextInt();
                this.out.println(pulaWejsciowa);
            }

            // pytamy pierwszego gracza jaka jest pula wejsciowa
            else if (odebrane.equals("wczytajKase"))
            {
                Integer iloscKasy = odbierzInta();
                gracz.setStanKonta(iloscKasy);
                System.out.println("Poczatkowa ilosc pieniedzy: "+iloscKasy);
                this.out.println("wyslalemKase");
            }
            
            // odbieramy wygrana
            else if (odebrane.equals("odbierzWygrana"))
            {
                Integer kasa = odbierzInta();
                gracz.zwiekszStanKonta(kasa);
                System.out.println("Gratulujemy, wygrales ture i cala forsa ze stolu idzie do Ciebie: "+kasa);
            }

            // masz podac teraz stawke na stol
            else if (odebrane.equals("podajStawke"))
            {
                System.out.println("Podaj stawkę albo spasuj ("+aktualnaStawka+"-"+gracz.getStanKonta()+") (spasowanie -1)");
                Integer stawka = wczytajInt(aktualnaStawka, gracz.getStanKonta(), true);
                if (stawka != -1)
                    gracz.setAktualnaStawka(stawka);
                this.out.println(stawka);
                //System.out.println("Cala forsa ze stolu idzie do Ciebie: "+kasa);
            }

            // dodajesz aktualna stawke
            else if (odebrane.equals("aktualnaStawka"))
            {
                aktualnaStawka = odbierzInta();
                System.out.println("Aktualna stawka");
            }

            else if (odebrane.equals("koniecLicytacji"))
            {
                // tutaj kasujemy wszystkie stawki etc
                System.out.println("Koniec licytacji");
                System.out.println("Ilosc pieniedzy: "+this.gracz.getStanKonta());
            }
            else if (odebrane.equals("nowaTura"))
            {
                gracz.nowaTura();
                aktualnaStawka = 0;
                System.out.println("Twoja kasa: "+gracz.getStanKonta());
                //gracz.usunKarty();
            }

            else if (odebrane.equals("koniecTury"))
            {
                this.out.println(gracz.koniecTury());
                //gracz.usunKarty();
            }

            else if (odebrane.equals("podajHierarchie"))
            {
                this.out.println(gracz.podajHierarchie());
            }

            // serwer przysyla nam pule wejsciowa
            else if (odebrane.equals("login")) {
                System.out.println("Wpisz swoj login");
                //String login = "cigol";
                String login = sc.next();
                this.out.println(login);
            }


            // serwer chce powiedziec cos ciekawego wiec warto posluchac
            else if (odebrane.equals("info")) {
                odebrane = this.odbierzDane();
                System.out.println(odebrane);
            }

            // tutaj odbieramy n kart od serwera
            else if (odebrane.equals("wysylanieKart"))
            {

                // odbieramy n kart
                odebrane = this.odbierzDane();
                Integer ileKart = new Integer(odebrane);
                System.out.println("Otrzymales: "+ileKart+" kart..");
                // odbieramy 5 kart
                for (int j=1;j<=ileKart;++j)
                {
                    odebrane = this.odbierzDane();
                    //System.out.println("odebrana karta: "+odebrane);
                    gracz.dodajKarte(new Integer(odebrane));
                }
                gracz.posortujKarty();
                gracz.wypiszKarty();
                
            }


            // wymieniamy karty
            else if (odebrane.equals("ileWymienic"))
            {
                
                System.out.println("Ile kart wymienić? (0-5)");
                // odbieramy n kart
                Integer ileWymienic = sc.nextInt();
                while( ileWymienic > 5 || ileWymienic < 0) ileWymienic = sc.nextInt();
                //Integer ileWymienic = 0;
                this.out.println(ileWymienic.toString());
                // odbieramy 5 kart
                Vector<Integer> wec = new Vector<Integer>();

                for (int j=1;j<=ileWymienic;++j)
                {
                    System.out.println("Wskaz karte z reki (1-5) :");
                    Integer numerKarty = sc.nextInt();
                    while((numerKarty > 5 || numerKarty < 1) || ( wec.contains(numerKarty)) ){
                        System.out.println("Nie ma takiej pozycji w reku lub wymieniasz dwa razy te sama karte. Ponow wybor (1-5) :");
                        numerKarty = sc.nextInt();
                    }
                    wec.add(numerKarty);
                    gracz.ustawDoWymiany(numerKarty-1);
                    Integer karta = gracz.pokazKarte(numerKarty-1);
                    this.out.println(karta.toString());
                    
                }
                gracz.usunWybraneKarty();
            }
            else if ( odebrane.equals("chceTwojeKarty")){
                this.out.println(gracz.podajKarty());
            }
            else if( odebrane.equals("staty")){
                odebrane = this.odbierzDane();
                if( odebrane.equals("8noweRozdanie")){
                    System.out.println("Masz chec na kolejne rodanie? Wpisz TAK/NIE.");
                    String login = sc.next();
                    while( !login.equals("TAK") && !login.equals("NIE")){
                        login = sc.next();
                    }
                    if( login.equals("TAK")){
                        this.out.println("gram");
                    }else {
                        this.out.println("nieGram");
                        break;
                    }
                }
            }

            // koniec gry
            else if (odebrane.equals("bye")) {
                break;
            }

            
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {

        PokerKlient klient = new PokerKlient();
        
        klient.komunikuj();
        klient.in.close();
        klient.out.close();
        klient.socket.close();
    }
}
